# Garbage Collection
# Goal
- Garbage Collection์ ์ญํ ์ ๋ํด ์ค๋ช ํ ์ ์๋ค.
- Garbage Collection์ ๋ฉ๋ชจ๋ฆฌ ํด์ ๊ณผ์ ์ 3๋จ๊ณ๋ก ์ค๋ช ํ ์ ์๋ค.
- Generational Gabage Collection์ ๋ํด ์ค๋ช ํ ์ ์๋ค.
- Generational Garbage Collection ๊ณผ์ ์ ๋ํด ์ค๋ช ํ ์ ์๋ค.
- Minor GC์ Major GC์ ์ฐจ์ด์ ์ ๋ํด ์ค๋ช ํ ์ ์๋ค.
# Abstract
C/C++ ํ๋ก๊ทธ๋๋ฐ์ ํ ๋ ๋ฉ๋ชจ๋ฆฌ ๋์(Memory Leak)๋ฅผ ๋ง๊ธฐ ์ํด ๊ฐ์ฒด๋ฅผ ์์ฑํ ํ ์ฌ์ฉ์ํ์ง ์๋ ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง์ ํด์ ํด์ฃผ์ด์ผ ํ์ต๋๋ค. ํ์ง๋ง, JAVA์์๋ JVM(Java Virtual Machine)์ด ๊ตฌ์ฑ๋ JRE(Java Runtime Environment)๊ฐ ์ ๊ณต๋๋ฉฐ, ๊ทธ ๊ตฌ์ฑ ์์ ์ค ํ๋์ธ Garbage Collection(์ดํ GC)์ด ์๋์ผ๋ก ์ฌ์ฉํ์ง ์๋ ๊ฐ์ฒด๋ฅผ ํ๊ดดํฉ๋๋ค.
GC์ ๋ํด์ ์์๋ณด๊ธฐ ์ ์ 'stop-the-world'๋ผ๋ ์ฉ์ด๋ฅผ ์์์ผํฉ๋๋ค. 'stop-the-world'๋, GC๋ฅผ ์คํํ๊ธฐ ์ํด JVM์ด ์ ํ๋ฆฌ์ผ์ด์ ์คํ์ ๋ฉ์ถ๋ ๊ฒ์ ๋๋ค. ์ด๋ค GC ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋๋ผ๋ 'stop-the-world'๋ ๋ฐ์ํ๊ฒ ๋๋๋ฐ, ๋๊ฐ์ ๊ฒฝ์ฐ GC ํ๋์ ์ด 'stop-the-world' ์๊ฐ์ ์ค์ด๋ ๊ฒ์ด๋ผ๊ณ ํฉ๋๋ค.
GC๋ฅผ ํด๋ ๋์ด์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด ์๋๋ฐ ๊ณ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ ค๊ณ ํ๋ฉด, OutOfMemoryError๊ฐ ๋ฐ์ํ์ฌ WAS๊ฐ ๋ค์ด๋ ์๋ ์์ต๋๋ค. ํ(Hang) ์ฆ, ์๋ฒ๊ฐ ์์ฒญ์ ์ฒ๋ฆฌ ๋ชปํ๊ณ ์๋ ์ํ๊ฐ ๋ฉ๋๋ค.
๋ฐ๋ผ์ ๊ท๋ชจ ์๋ JAVA ์ ํ๋ฆฌ์ผ์ด์ ์ ํจ์จ์ ์ผ๋ก ๊ฐ๋ฐํ๊ธฐ ์ํด์๋ GC์ ๋ํด ์ ์์์ผํ๋ค๊ณ ํฉ๋๋ค. ์ด๋ฒ์๋ GC์ ๋ํด ๊ฐ๋จํ๊ฒ ์์๋ณด๊ฒ ์ต๋๋ค.
# Garbage Collection
C/C++ ์ธ์ด์ ๋ฌ๋ฆฌ ์๋ฐ๋ ๊ฐ๋ฐ์๊ฐ ๋ช ์์ ์ผ๋ก ๊ฐ์ฒด๋ฅผ ํด์ ํ ํ์๊ฐ ์์ต๋๋ค. ์๋ฐ ์ธ์ด์ ํฐ ์ฅ์ ์ด๊ธฐ๋ ํฉ๋๋ค. ์ฌ์ฉํ์ง ์๋ ๊ฐ์ฒด๋ ๋ฉ๋ชจ๋ฆฌ์์ ์ญ์ ํ๋ ์์ ์ GC๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ JVM์์ GC๋ฅผ ์ํํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก JVM์ ๋ฉ๋ชจ๋ฆฌ๋ ์ด 5๊ฐ์ง ์์ญ(class, stack, heap, native method, PC)์ผ๋ก ๋๋๋๋ฐ, GC๋ ํ ๋ฉ๋ชจ๋ฆฌ๋ง ๋ค๋ฃน๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ GC์ ๋์์ด ๋ฉ๋๋ค.
- ๊ฐ์ฒด๊ฐ NULL์ธ ๊ฒฝ์ฐ (ex. String str = null)
- ๋ธ๋ญ ์คํ ์ข ๋ฃ ํ, ๋ธ๋ญ ์์์ ์์ฑ๋ ๊ฐ์ฒด
- ๋ถ๋ชจ ๊ฐ์ฒด๊ฐ NULL์ธ ๊ฒฝ์ฐ, ํฌํจํ๋ ์์ ๊ฐ์ฒด
GC๋ Weak Generational Hypothesis
์ ๊ธฐ๋ฐํฉ๋๋ค. ์ฐ์ GC์ ๋ฉ๋ชจ๋ฆฌ ํด์ ๊ณผ์ ์ ๋ํด ์ดํด๋ณด๊ฒ ์ต๋๋ค.
# GC์ ๋ฉ๋ชจ๋ฆฌ ํด์ ๊ณผ์
# Marking
- ํ๋ก์ธ์ค๋ ๋งํน์ ํธ์ถํฉ๋๋ค. ์ด๊ฒ์ GC๊ฐ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ฌ์ฉ๋๋์ง ์๋์ง๋ฅผ ์ฐพ์๋ ๋๋ค. ์ฐธ์กฐ๋๋ ๊ฐ์ฒด๋ ํ๋์์ผ๋ก, ์ฐธ์กฐ๋์ง ์๋ ๊ฐ์ฒด๋ ์ฃผํฉ์์ผ๋ก ๋ณด์ฌ์ง๋๋ค. ๋ชจ๋ ์ค๋ธ์ ํธ๋ ๋งํน ๋จ๊ณ์์ ๊ฒฐ์ ์ ์ํด ์ค์บ๋์ด์ง๋๋ค. ๋ชจ๋ ์ค๋ธ์ ํธ๋ฅผ ์ค์บํ๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ๋ง์ ์๊ฐ์ ์๋ชจํ๊ฒ ๋ฉ๋๋ค.
# Normal Deletion
- ์ฐธ์กฐ๋์ง ์๋ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ๊ณ , ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐํํฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ Allocator๋ ๋ฐํ๋์ด ๋น์ด์ง ๋ธ๋ญ์ ์ฐธ์กฐ ์์น๋ฅผ ์ ์ฅํด ๋์๋ค๊ณ ์๋ก์ด ์ค๋ธ์ ํธ๊ฐ ์ ์ธ๋๋ฉด ํ ๋น๋๋๋ก ํฉ๋๋ค.
# Compacting
- ํผํฌ๋จผ์ค๋ฅผ ํฅ์์ํค๊ธฐ ์ํด, ์ฐธ์กฐ๋์ง ์๋ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ๊ณ ๋ํ ๋จ์ ์ฐธ์กฐ๋์ด์ง๋ ๊ฐ์ฒด๋ค์ ๋ฌถ์ต๋๋ค. ์ด๋ค์ ๋ฌถ์์ผ๋ก์ ๊ณต๊ฐ์ด ์๊ธฐ๋ฏ๋ก ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์์ ๋ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ์งํ ํ ์ ์์ต๋๋ค.
# Generational Garbage Collection ๋ฐฐ๊ฒฝ
์์ ๊ฐ์ด ๋ชจ๋ ๊ฐ์ฒด๋ฅผ Mark & Compact
ํ๋ JVM์ ๋นํจ์จ์ ์
๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๊ทธ๋ํ๋ฅผ ๋ณด์๊ฒ ์ต๋๋ค.
Y์ถ์ ํ ๋น๋ ๋ฐ์ดํธ์ ์์ด๊ณ X์ถ์ ๋ฐ์ดํธ๊ฐ ํ ๋น๋ ๋์ ์๊ฐ์ ๋๋ค. ๋ณด์๋ค์ํผ ์๊ฐ์ด ๊ฐ์๋ก ์ ์ ๊ฐ์ฒด๋ง์ด ๋จ์ต๋๋ค. ์์ ๊ฐ์ ๊ทธ๋ํ์ ๊ธฐ๋ฐํ ๊ฒ์ด Weak Generational Hypothesis ์ ๋๋ค.
# Weak Generational Hypothesis
์ ๊ท๋ก ์์ฑํ ๊ฐ์ฒด์ ๋๋ถ๋ถ์ ๊ธ๋ฐฉ ์ฌ์ฉํ์ง ์๋ ์ํ๊ฐ ๋๊ณ , ์ค๋๋ ๊ฐ์ฒด์์ ์ ๊ท ๊ฐ์ฒด๋ก์ ์ฐธ์กฐ๋ ๋งค์ฐ ์ ๊ฒ ์กด์ฌํ๋ค๋ ๊ฐ์ค์ ๋๋ค.
์ด ๊ฐ์ค์ ๊ธฐ๋ฐํ์ฌ ์๋ฐ๋ Young ์์ญ๊ณผ Old ์์ญ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ถํ ํ๊ณ , ์ ๊ท๋ก ์์ฑ๋๋ ๊ฐ์ฒด๋ Young ์์ญ์ ๋ณด๊ดํ๊ณ , ์ค๋ซ๋์ ์ด์๋จ์ ๊ฐ์ฒด๋ Old ์์ญ์ ๋ณด๊ดํฉ๋๋ค.
# Generational Gabage Collection
# Young ์์ญ(Yong Generation ์์ญ)
์๋กญ๊ฒ ์์ฑํ ๊ฐ์ฒด์ ๋๋ถ๋ถ์ด ์ฌ๊ธฐ์ ์์นํฉ๋๋ค. ๋๋ถ๋ถ์ ๊ฐ์ฒด๊ฐ ๊ธ๋ฐฉ ์ ๊ทผ ๋ถ๊ฐ๋ฅ ์ํ๊ฐ ๋๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ๋ง์ ๊ฐ์ฒด๊ฐ Young ์์ญ์ ์์ฑ๋์๋ค๊ฐ ์ฌ๋ผ์ง๋๋ค. ์ด ์์ญ์์ ๊ฐ์ฒด๊ฐ ์ฌ๋ผ์ง๋ Minor GC ๊ฐ ๋ฐ์ํ๋ค๊ณ ๋งํฉ๋๋ค.
# Old ์์ญ(Old Generation ์์ญ)
์ ๊ทผ ๋ถ๊ฐ๋ฅ ์ํ๋ก ๋์ง ์์ Young ์์ญ์์ ์ด์๋จ์ ๊ฐ์ฒด๊ฐ ์ฌ๊ธฐ๋ก ๋ณต์ฌ๋ฉ๋๋ค. ๋๋ถ๋ถ Young ์์ญ๋ณด๋ค ํฌ๊ฒ ํ ๋นํ๋ฉฐ, ํฌ๊ธฐ๊ฐ ํฐ ๋งํผ Young ์์ญ๋ณด๋ค GC๋ ์ ๊ฒ ๋ฐ์ํฉ๋๋ค. ์ด ์์ญ์์ ๊ฐ์ฒด๊ฐ ์ฌ๋ผ์ง ๋ Major GC(ํน์ Full GC) ๊ฐ ๋ฐ์ํ๋ค๊ณ ๋งํฉ๋๋ค.
# Permanet ์์ญ
Method Area๋ผ๊ณ ๋ ํฉ๋๋ค. JVM์ด ํด๋์ค๋ค๊ณผ ๋ฉ์๋๋ค์ ์ค๋ช ํ๊ธฐ ์ํด ํ์ํ ๋ฉํ๋ฐ์ดํฐ๋ค์ ํฌํจํ๊ณ ์์ต๋๋ค. JDK8๋ถํฐ๋ PermGen์ Metaspace๋ก ๊ต์ฒด๋ฉ๋๋ค.
# Generational Garbage Collection ๊ณผ์
# ์ด๋ ํ ์๋ก์ด ๊ฐ์ฒด๊ฐ ๋ค์ด์ค๋ฉด Eden Space์ ํ ๋นํฉ๋๋ค.
# Eden space๊ฐ ๊ฐ๋์ฐจ๊ฒ ๋๋ฉด, minor garbage collection์ด ์์๋ฉ๋๋ค.
# ์ฐธ์กฐ๋๋ ๊ฐ์ฒด๋ค์ ์ฒซ ๋ฒ์งธ survivor(S0)๋ก ์ด๋๋์ด์ง๊ณ , ๋น ์ฐธ์กฐ ๊ฐ์ฒด๋ Eden space๊ฐ clear ๋ ๋ ๋ฐํ๋ฉ๋๋ค.
๋ค์ minor GC ๋, Eden space์์๋ ๊ฐ์ ์ผ์ด ์ผ์ด๋ฉ๋๋ค. ๋น ์ฐธ์กฐ ๊ฐ์ฒด๋ ์ญ์ ๋๊ณ ์ฐธ์กฐ ๊ฐ์ฒด๋ survivor space๋ก ์ด๋ํ๋ ๊ฒ ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด ์ผ์ด์ค์์ ์ฐธ์กฐ ๊ฐ์ฒด๋ ๋ ๋ฒ์งธ survivor space๋ก ์ด๋ํ๊ฒ ๋ฉ๋๋ค. ๊ฒ๋ค๊ฐ ์ต๊ทผ minor GC์์ ์ฒซ ๋ฒ์งธ survivor space๋ก ์ด๋๋ ๊ฐ์ฒด๋ค๋ age๊ฐ ์ฆ๊ฐํ๊ณ S1 ๊ณต๊ฐ์ผ๋ก ์ด๋ํ๊ฒ ๋ฉ๋๋ค. ํ๋ฒ ๋ชจ๋ surviving ๊ฐ์ฒด๋ค์ด S1์ผ๋ก ์ด๋ํ๊ฒ ๋๋ฉด S0์ Eden ๊ณต๊ฐ์ Clear ๋ฉ๋๋ค. ์ฃผ์ํด์ผํ ์ ์ ์ด์ ์ฐ๋ฆฌ๋ ๋ค๋ฅธ aged ๊ฐ์ฒด๋ค์ ์๋ฐ์ด๋ฒ ๊ณต๊ฐ์ ๊ฐ์ง๊ฒ ๋์๋ค๋ ๊ฒ์ ๋๋ค.
๋ค์ minor GC ๋, ๊ฐ์ ๊ณผ์ ์ด ๋ฐ๋ณต ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด ๋ฒ์ survivor space๋ค์ switch ๋ฉ๋๋ค. ์ฐธ์กฐ๋๋ ๊ฐ์ฒด๋ค์ S0๋ก ์ด๋ํฉ๋๋ค. ์ด์๋จ์ ๊ฐ์ฒด๋ค์ aged๋์ฃ . ๊ทธ๋ฆฌ๊ณ Eden๊ณผ S1 ๊ณต๊ฐ์ Clear ๋ฉ๋๋ค.
์๋ ๊ทธ๋จ์ promotion์ ๋ณด์ฌ์ค๋๋ค. minor GC ํ aged ์ค๋ธ์ ํธ๋ค์ด ์ผ์ ํ age threshold(๋ฌธ์ง๋ฐฉ)์ ๋๊ฒ ๋๋ฉด ๊ทธ๋ค์ young generation์์ old๋ก promotion ๋์ด์ง๋๋ค. ์ฌ๊ธฐ์๋ 8์ ์๋ก ๋ค์์ต๋๋ค.
minor GC๊ฐ ๊ณ์๋๊ณ ๊ณ์ํด์ ๊ฐ์ฒด๋ค์ด Old Generation์ผ๋ก ์ด๋๋ฉ๋๋ค.
์๋ ๊ทธ๋ฆผ์ ์ ๊ณผ์ ์ ๋ณด์ฌ์ฃผ๊ณ ์์ต๋๋ค. ๊ฒฐ๊ตญ major GC๊ฐ old Generation์ ์ํ๋๊ณ , old Generation์ Clear ๋๊ณ , ๊ณต๊ฐ์ด Compact ๋์ด์ง๋๋ค.
# Conclusion
์ด์ธ์๋ ์ ๋ง ๋ง์ ๋ด์ฉ์ด ์์ง๋ง, ๊ฐ๋จํ๊ฒ๋๋ง GC์ ๊ฐ๋ ๊ณผ ์๋์๋ฆฌ์ ๋ํด ์์๋ณด์์ต๋๋ค. ๊ฐ๋ฐ์ ๊ธฐ์ ๋ฉด์ ์์๋ ์ข ์ข ๋์ค๋ ์ด๋ฒ์ ํ์คํ๊ฒ ํ์ตํด๋๋ฉด ๋์์ด ๋ง์ด ๋ ๊ฒ ๊ฐ์ต๋๋ค.